@mieweb/ui 0.7.3-dev.9 → 0.8.0-dev.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/brands/index.cjs +12 -12
- package/dist/brands/index.js +3 -3
- package/dist/chunk-3IMM2PM4.js +259 -0
- package/dist/chunk-3IMM2PM4.js.map +1 -0
- package/dist/chunk-3SHLOF4V.cjs +128 -0
- package/dist/chunk-3SHLOF4V.cjs.map +1 -0
- package/dist/chunk-3TXOFAXP.cjs +139 -0
- package/dist/chunk-3TXOFAXP.cjs.map +1 -0
- package/dist/{chunk-ZBI52NP2.cjs → chunk-56QJHQ5C.cjs} +156 -39
- package/dist/chunk-56QJHQ5C.cjs.map +1 -0
- package/dist/chunk-5JZIDILK.cjs +164 -0
- package/dist/chunk-5JZIDILK.cjs.map +1 -0
- package/dist/chunk-5MXO6PEV.cjs +78 -0
- package/dist/chunk-5MXO6PEV.cjs.map +1 -0
- package/dist/chunk-5QZ73PZC.js +62 -0
- package/dist/chunk-5QZ73PZC.js.map +1 -0
- package/dist/chunk-6NZXWKUE.js +3 -0
- package/dist/chunk-6NZXWKUE.js.map +1 -0
- package/dist/chunk-6SCQ7FKT.js +115 -0
- package/dist/chunk-6SCQ7FKT.js.map +1 -0
- package/dist/{chunk-KFLDXJEE.js → chunk-753Z3NXL.js} +46 -15
- package/dist/chunk-753Z3NXL.js.map +1 -0
- package/dist/{chunk-S3MKIDYG.cjs → chunk-7AECNMYV.cjs} +46 -15
- package/dist/chunk-7AECNMYV.cjs.map +1 -0
- package/dist/chunk-7IKLGH3Z.cjs +92 -0
- package/dist/chunk-7IKLGH3Z.cjs.map +1 -0
- package/dist/chunk-7L7OPISJ.cjs +291 -0
- package/dist/chunk-7L7OPISJ.cjs.map +1 -0
- package/dist/chunk-7RV6CAP6.cjs +106 -0
- package/dist/chunk-7RV6CAP6.cjs.map +1 -0
- package/dist/{chunk-LC7YHZXM.js → chunk-A5YOIJKL.js} +5 -5
- package/dist/{chunk-LC7YHZXM.js.map → chunk-A5YOIJKL.js.map} +1 -1
- package/dist/{chunk-CVZYOMEW.js → chunk-AESFOMSH.js} +325 -3
- package/dist/chunk-AESFOMSH.js.map +1 -0
- package/dist/{chunk-RBS3GHDZ.cjs → chunk-BOW7ZGI2.cjs} +4 -4
- package/dist/{chunk-RBS3GHDZ.cjs.map → chunk-BOW7ZGI2.cjs.map} +1 -1
- package/dist/{chunk-WUNWHOLA.cjs → chunk-BSDBI6H7.cjs} +116 -26
- package/dist/chunk-BSDBI6H7.cjs.map +1 -0
- package/dist/chunk-CG4ZKJLE.js +84 -0
- package/dist/chunk-CG4ZKJLE.js.map +1 -0
- package/dist/{chunk-Z4PECE5S.js → chunk-DX64KLSN.js} +2 -2
- package/dist/{chunk-Z4PECE5S.js.map → chunk-DX64KLSN.js.map} +1 -1
- package/dist/chunk-ELYGV32O.cjs +230 -0
- package/dist/chunk-ELYGV32O.cjs.map +1 -0
- package/dist/{chunk-QUUBTNMH.js → chunk-EPSB4WTL.js} +45 -15
- package/dist/chunk-EPSB4WTL.js.map +1 -0
- package/dist/chunk-F57VRLKP.js +708 -0
- package/dist/chunk-F57VRLKP.js.map +1 -0
- package/dist/{chunk-5IDYOJHO.cjs → chunk-G7EQ3JPX.cjs} +45 -15
- package/dist/chunk-G7EQ3JPX.cjs.map +1 -0
- package/dist/{chunk-FKLUSYFP.cjs → chunk-GQVL2JKQ.cjs} +4 -4
- package/dist/{chunk-FKLUSYFP.cjs.map → chunk-GQVL2JKQ.cjs.map} +1 -1
- package/dist/{chunk-3D4ITDLO.js → chunk-GXODR6V4.js} +3 -3
- package/dist/{chunk-3D4ITDLO.js.map → chunk-GXODR6V4.js.map} +1 -1
- package/dist/{chunk-AFGADE3B.js → chunk-H3YO5GBM.js} +117 -27
- package/dist/chunk-H3YO5GBM.js.map +1 -0
- package/dist/chunk-HK3AMH3Q.cjs +151 -0
- package/dist/chunk-HK3AMH3Q.cjs.map +1 -0
- package/dist/chunk-HQ3XPCHG.js +114 -0
- package/dist/chunk-HQ3XPCHG.js.map +1 -0
- package/dist/chunk-I44YNYI6.cjs +4 -0
- package/dist/chunk-I44YNYI6.cjs.map +1 -0
- package/dist/{chunk-5FAWCLPY.js → chunk-IILJGFI5.js} +40 -29
- package/dist/chunk-IILJGFI5.js.map +1 -0
- package/dist/{chunk-XFRQFWSY.js → chunk-IYXCFIMP.js} +8 -8
- package/dist/{chunk-XFRQFWSY.js.map → chunk-IYXCFIMP.js.map} +1 -1
- package/dist/{chunk-6J7UGYT5.cjs → chunk-JHGMZX4I.cjs} +47 -7
- package/dist/chunk-JHGMZX4I.cjs.map +1 -0
- package/dist/chunk-JHZW3Y62.js +142 -0
- package/dist/chunk-JHZW3Y62.js.map +1 -0
- package/dist/{chunk-JDHIBJ5K.cjs → chunk-JWTCEWQ4.cjs} +2 -2
- package/dist/{chunk-JDHIBJ5K.cjs.map → chunk-JWTCEWQ4.cjs.map} +1 -1
- package/dist/{chunk-URHXR5SC.cjs → chunk-KVE7PQ5P.cjs} +7 -7
- package/dist/{chunk-URHXR5SC.cjs.map → chunk-KVE7PQ5P.cjs.map} +1 -1
- package/dist/{chunk-MJFF4AXH.cjs → chunk-L6D4CKLV.cjs} +325 -3
- package/dist/chunk-L6D4CKLV.cjs.map +1 -0
- package/dist/chunk-L6MDULYB.js +87 -0
- package/dist/chunk-L6MDULYB.js.map +1 -0
- package/dist/{chunk-SYIFEJSF.cjs → chunk-LQHI44OZ.cjs} +13 -13
- package/dist/{chunk-SYIFEJSF.cjs.map → chunk-LQHI44OZ.cjs.map} +1 -1
- package/dist/{chunk-HIDV32ZX.js → chunk-LZU7YBXG.js} +3 -3
- package/dist/{chunk-HIDV32ZX.js.map → chunk-LZU7YBXG.js.map} +1 -1
- package/dist/chunk-N5O47VGS.cjs +109 -0
- package/dist/chunk-N5O47VGS.cjs.map +1 -0
- package/dist/chunk-NGSDBWKA.cjs +84 -0
- package/dist/chunk-NGSDBWKA.cjs.map +1 -0
- package/dist/chunk-NMBYU7D7.cjs +31 -0
- package/dist/chunk-NMBYU7D7.cjs.map +1 -0
- package/dist/{chunk-P6L74SKG.js → chunk-QGZC43L7.js} +47 -7
- package/dist/chunk-QGZC43L7.js.map +1 -0
- package/dist/{chunk-FTRGZOVJ.js → chunk-QHTDWIED.js} +3 -3
- package/dist/{chunk-FTRGZOVJ.js.map → chunk-QHTDWIED.js.map} +1 -1
- package/dist/chunk-RUGHNFQG.js +28 -0
- package/dist/chunk-RUGHNFQG.js.map +1 -0
- package/dist/{chunk-Q6A4RVAN.cjs → chunk-SK7H3Z67.cjs} +37 -37
- package/dist/{chunk-Q6A4RVAN.cjs.map → chunk-SK7H3Z67.cjs.map} +1 -1
- package/dist/{chunk-MO65V64I.js → chunk-TXRQQMG5.js} +2 -2
- package/dist/{chunk-MO65V64I.js.map → chunk-TXRQQMG5.js.map} +1 -1
- package/dist/{chunk-3YDTZUI6.cjs → chunk-U5TTXN45.cjs} +42 -31
- package/dist/chunk-U5TTXN45.cjs.map +1 -0
- package/dist/chunk-WBGUYSWY.js +90 -0
- package/dist/chunk-WBGUYSWY.js.map +1 -0
- package/dist/{chunk-LJBWCUKP.cjs → chunk-WIYQI35R.cjs} +2 -2
- package/dist/{chunk-LJBWCUKP.cjs.map → chunk-WIYQI35R.cjs.map} +1 -1
- package/dist/chunk-WKSUL2ZN.js +56 -0
- package/dist/chunk-WKSUL2ZN.js.map +1 -0
- package/dist/chunk-X5ZPYYMS.js +105 -0
- package/dist/chunk-X5ZPYYMS.js.map +1 -0
- package/dist/{chunk-DLBV42JD.js → chunk-XBKOZRDO.js} +156 -39
- package/dist/chunk-XBKOZRDO.js.map +1 -0
- package/dist/{chunk-XB54G7WS.cjs → chunk-XJTFZLWH.cjs} +2 -86
- package/dist/chunk-XJTFZLWH.cjs.map +1 -0
- package/dist/chunk-XMECP2MD.js +208 -0
- package/dist/chunk-XMECP2MD.js.map +1 -0
- package/dist/{chunk-GTHNWP4P.js → chunk-XUVEF2RQ.js} +4 -87
- package/dist/chunk-XUVEF2RQ.js.map +1 -0
- package/dist/chunk-XWYKLEKG.js +269 -0
- package/dist/chunk-XWYKLEKG.js.map +1 -0
- package/dist/chunk-Y6YSJPVC.js +129 -0
- package/dist/chunk-Y6YSJPVC.js.map +1 -0
- package/dist/chunk-YVIH26FG.cjs +736 -0
- package/dist/chunk-YVIH26FG.cjs.map +1 -0
- package/dist/chunk-Z5S5JEJD.cjs +286 -0
- package/dist/chunk-Z5S5JEJD.cjs.map +1 -0
- package/dist/chunk-ZO4L6C2Y.cjs +137 -0
- package/dist/chunk-ZO4L6C2Y.cjs.map +1 -0
- package/dist/{collabKit-QZL4P5T5.js → collabKit-A643VH2I.js} +7 -3
- package/dist/collabKit-A643VH2I.js.map +1 -0
- package/dist/{collabKit-UF7E6V3N.cjs → collabKit-Q4A36LDA.cjs} +7 -3
- package/dist/collabKit-Q4A36LDA.cjs.map +1 -0
- package/dist/components/Accordion/index.cjs +13 -0
- package/dist/components/Accordion/index.cjs.map +1 -0
- package/dist/components/Accordion/index.d.cts +50 -0
- package/dist/components/Accordion/index.d.ts +50 -0
- package/dist/components/Accordion/index.js +4 -0
- package/dist/components/Accordion/index.js.map +1 -0
- package/dist/components/Alert/index.d.cts +1 -1
- package/dist/components/Alert/index.d.ts +1 -1
- package/dist/components/Autocomplete/index.cjs +4 -3
- package/dist/components/Autocomplete/index.d.cts +20 -3
- package/dist/components/Autocomplete/index.d.ts +20 -3
- package/dist/components/Autocomplete/index.js +3 -2
- package/dist/components/Badge/index.d.cts +1 -1
- package/dist/components/Badge/index.d.ts +1 -1
- package/dist/components/Card/index.d.cts +1 -1
- package/dist/components/Card/index.d.ts +1 -1
- package/dist/components/Checkbox/index.cjs +5 -4
- package/dist/components/Checkbox/index.d.cts +9 -1
- package/dist/components/Checkbox/index.d.ts +9 -1
- package/dist/components/Checkbox/index.js +2 -1
- package/dist/components/ClampedText/index.cjs +13 -0
- package/dist/components/ClampedText/index.cjs.map +1 -0
- package/dist/components/ClampedText/index.d.cts +33 -0
- package/dist/components/ClampedText/index.d.ts +33 -0
- package/dist/components/ClampedText/index.js +4 -0
- package/dist/components/ClampedText/index.js.map +1 -0
- package/dist/components/CopyButton/index.cjs +13 -0
- package/dist/components/CopyButton/index.cjs.map +1 -0
- package/dist/components/CopyButton/index.d.cts +29 -0
- package/dist/components/CopyButton/index.d.ts +29 -0
- package/dist/components/CopyButton/index.js +4 -0
- package/dist/components/CopyButton/index.js.map +1 -0
- package/dist/components/CustomizableDashboard/index.cjs +43 -0
- package/dist/components/CustomizableDashboard/index.cjs.map +1 -0
- package/dist/components/CustomizableDashboard/index.d.cts +195 -0
- package/dist/components/CustomizableDashboard/index.d.ts +195 -0
- package/dist/components/CustomizableDashboard/index.js +10 -0
- package/dist/components/CustomizableDashboard/index.js.map +1 -0
- package/dist/components/DateInput/index.cjs +4 -3
- package/dist/components/DateInput/index.d.cts +1 -0
- package/dist/components/DateInput/index.d.ts +1 -0
- package/dist/components/DateInput/index.js +3 -2
- package/dist/components/Dropdown/index.cjs +9 -8
- package/dist/components/Dropdown/index.js +3 -2
- package/dist/components/FilterSummaryBar/index.cjs +13 -0
- package/dist/components/FilterSummaryBar/index.cjs.map +1 -0
- package/dist/components/FilterSummaryBar/index.d.cts +53 -0
- package/dist/components/FilterSummaryBar/index.d.ts +53 -0
- package/dist/components/FilterSummaryBar/index.js +4 -0
- package/dist/components/FilterSummaryBar/index.js.map +1 -0
- package/dist/components/FreshnessBadge/index.cjs +25 -0
- package/dist/components/FreshnessBadge/index.cjs.map +1 -0
- package/dist/components/FreshnessBadge/index.d.cts +49 -0
- package/dist/components/FreshnessBadge/index.d.ts +49 -0
- package/dist/components/FreshnessBadge/index.js +4 -0
- package/dist/components/FreshnessBadge/index.js.map +1 -0
- package/dist/components/GlossaryTooltip/index.cjs +15 -0
- package/dist/components/GlossaryTooltip/index.cjs.map +1 -0
- package/dist/components/GlossaryTooltip/index.d.cts +64 -0
- package/dist/components/GlossaryTooltip/index.d.ts +64 -0
- package/dist/components/GlossaryTooltip/index.js +6 -0
- package/dist/components/GlossaryTooltip/index.js.map +1 -0
- package/dist/components/Input/index.cjs +20 -3
- package/dist/components/Input/index.d.cts +37 -2
- package/dist/components/Input/index.d.ts +37 -2
- package/dist/components/Input/index.js +2 -1
- package/dist/components/KeyboardShortcutsOverlay/index.cjs +21 -0
- package/dist/components/KeyboardShortcutsOverlay/index.cjs.map +1 -0
- package/dist/components/KeyboardShortcutsOverlay/index.d.cts +54 -0
- package/dist/components/KeyboardShortcutsOverlay/index.d.ts +54 -0
- package/dist/components/KeyboardShortcutsOverlay/index.js +8 -0
- package/dist/components/KeyboardShortcutsOverlay/index.js.map +1 -0
- package/dist/components/Markdown/index.cjs +10 -10
- package/dist/components/Markdown/index.js +2 -2
- package/dist/components/MediaEditor/index.cjs +10 -9
- package/dist/components/MediaEditor/index.js +5 -4
- package/dist/components/PhoneInput/index.cjs +5 -4
- package/dist/components/PhoneInput/index.js +3 -2
- package/dist/components/Progress/index.d.cts +1 -1
- package/dist/components/Progress/index.d.ts +1 -1
- package/dist/components/Radio/index.cjs +5 -4
- package/dist/components/Radio/index.d.cts +9 -1
- package/dist/components/Radio/index.d.ts +9 -1
- package/dist/components/Radio/index.js +2 -1
- package/dist/components/ReadingProgressBar/index.cjs +13 -0
- package/dist/components/ReadingProgressBar/index.cjs.map +1 -0
- package/dist/components/ReadingProgressBar/index.d.cts +20 -0
- package/dist/components/ReadingProgressBar/index.d.ts +20 -0
- package/dist/components/ReadingProgressBar/index.js +4 -0
- package/dist/components/ReadingProgressBar/index.js.map +1 -0
- package/dist/components/RichTextEditor/index.cjs +7 -6
- package/dist/components/RichTextEditor/index.js +4 -3
- package/dist/components/SectionSpyNav/index.cjs +15 -0
- package/dist/components/SectionSpyNav/index.cjs.map +1 -0
- package/dist/components/SectionSpyNav/index.d.cts +63 -0
- package/dist/components/SectionSpyNav/index.d.ts +63 -0
- package/dist/components/SectionSpyNav/index.js +6 -0
- package/dist/components/SectionSpyNav/index.js.map +1 -0
- package/dist/components/Select/index.cjs +5 -3
- package/dist/components/Select/index.d.cts +56 -9
- package/dist/components/Select/index.d.ts +56 -9
- package/dist/components/Select/index.js +3 -1
- package/dist/components/Slider/index.d.cts +2 -2
- package/dist/components/Slider/index.d.ts +2 -2
- package/dist/components/SourceTip/index.cjs +15 -0
- package/dist/components/SourceTip/index.cjs.map +1 -0
- package/dist/components/SourceTip/index.d.cts +58 -0
- package/dist/components/SourceTip/index.d.ts +58 -0
- package/dist/components/SourceTip/index.js +6 -0
- package/dist/components/SourceTip/index.js.map +1 -0
- package/dist/components/Sparkline/index.cjs +13 -0
- package/dist/components/Sparkline/index.cjs.map +1 -0
- package/dist/components/Sparkline/index.d.cts +53 -0
- package/dist/components/Sparkline/index.d.ts +53 -0
- package/dist/components/Sparkline/index.js +4 -0
- package/dist/components/Sparkline/index.js.map +1 -0
- package/dist/components/Spinner/index.d.cts +1 -1
- package/dist/components/Spinner/index.d.ts +1 -1
- package/dist/components/SuperChat/index.cjs +8 -7
- package/dist/components/SuperChat/index.cjs.map +1 -1
- package/dist/components/SuperChat/index.js +4 -3
- package/dist/components/SuperChat/index.js.map +1 -1
- package/dist/components/SuperChat/plugins/index.cjs +2 -22
- package/dist/components/SuperChat/plugins/index.cjs.map +1 -1
- package/dist/components/SuperChat/plugins/index.js +1 -21
- package/dist/components/SuperChat/plugins/index.js.map +1 -1
- package/dist/components/Text/index.d.cts +1 -1
- package/dist/components/Text/index.d.ts +1 -1
- package/dist/components/Textarea/index.cjs +5 -3
- package/dist/components/Textarea/index.d.cts +19 -1
- package/dist/components/Textarea/index.d.ts +19 -1
- package/dist/components/Textarea/index.js +3 -1
- package/dist/datavis.cjs +1 -1
- package/dist/datavis.js +1 -1
- package/dist/esheet.cjs +11 -10
- package/dist/esheet.cjs.map +1 -1
- package/dist/esheet.js +8 -7
- package/dist/esheet.js.map +1 -1
- package/dist/hooks/index.cjs +27 -17
- package/dist/hooks/index.d.cts +16 -1
- package/dist/hooks/index.d.ts +16 -1
- package/dist/hooks/index.js +3 -1
- package/dist/index.cjs +1026 -651
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +83 -10
- package/dist/index.d.ts +83 -10
- package/dist/index.js +316 -53
- package/dist/index.js.map +1 -1
- package/dist/kerebron.cjs +200 -68
- package/dist/kerebron.cjs.map +1 -1
- package/dist/kerebron.css +129 -0
- package/dist/kerebron.d.cts +52 -3
- package/dist/kerebron.d.ts +52 -3
- package/dist/kerebron.js +201 -69
- package/dist/kerebron.js.map +1 -1
- package/dist/styles.css +1 -1
- package/dist/tailwind-preset.cjs +4 -4
- package/dist/tailwind-preset.js +1 -1
- package/dist/utils/index.cjs +9 -9
- package/dist/utils/index.js +1 -1
- package/package.json +9 -4
- package/dist/chunk-3YDTZUI6.cjs.map +0 -1
- package/dist/chunk-5FAWCLPY.js.map +0 -1
- package/dist/chunk-5IDYOJHO.cjs.map +0 -1
- package/dist/chunk-6ECKH4DJ.cjs +0 -147
- package/dist/chunk-6ECKH4DJ.cjs.map +0 -1
- package/dist/chunk-6J7UGYT5.cjs.map +0 -1
- package/dist/chunk-AFGADE3B.js.map +0 -1
- package/dist/chunk-CVZYOMEW.js.map +0 -1
- package/dist/chunk-DLBV42JD.js.map +0 -1
- package/dist/chunk-GTHNWP4P.js.map +0 -1
- package/dist/chunk-KFLDXJEE.js.map +0 -1
- package/dist/chunk-MJFF4AXH.cjs.map +0 -1
- package/dist/chunk-P6L74SKG.js.map +0 -1
- package/dist/chunk-QUUBTNMH.js.map +0 -1
- package/dist/chunk-S3MKIDYG.cjs.map +0 -1
- package/dist/chunk-WUNWHOLA.cjs.map +0 -1
- package/dist/chunk-XB54G7WS.cjs.map +0 -1
- package/dist/chunk-YXCE2HSK.js +0 -124
- package/dist/chunk-YXCE2HSK.js.map +0 -1
- package/dist/chunk-ZBI52NP2.cjs.map +0 -1
- package/dist/collabKit-QZL4P5T5.js.map +0 -1
- package/dist/collabKit-UF7E6V3N.cjs.map +0 -1
package/dist/brands/index.cjs
CHANGED
|
@@ -1,21 +1,25 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var
|
|
3
|
+
var chunkJWTCEWQ4_cjs = require('../chunk-JWTCEWQ4.cjs');
|
|
4
|
+
var chunkX7S76WB7_cjs = require('../chunk-X7S76WB7.cjs');
|
|
4
5
|
var chunkP52GA3GJ_cjs = require('../chunk-P52GA3GJ.cjs');
|
|
5
6
|
var chunkLCQGAOAZ_cjs = require('../chunk-LCQGAOAZ.cjs');
|
|
6
7
|
var chunkZ5J4NTPL_cjs = require('../chunk-Z5J4NTPL.cjs');
|
|
7
8
|
var chunkU7VQUOLS_cjs = require('../chunk-U7VQUOLS.cjs');
|
|
8
|
-
var chunkRR2MJBGV_cjs = require('../chunk-RR2MJBGV.cjs');
|
|
9
|
-
var chunkX7S76WB7_cjs = require('../chunk-X7S76WB7.cjs');
|
|
10
9
|
var chunkJ644FU54_cjs = require('../chunk-J644FU54.cjs');
|
|
11
10
|
var chunkWNJRS7Y7_cjs = require('../chunk-WNJRS7Y7.cjs');
|
|
12
11
|
var chunkUCGUA3QV_cjs = require('../chunk-UCGUA3QV.cjs');
|
|
12
|
+
var chunkRR2MJBGV_cjs = require('../chunk-RR2MJBGV.cjs');
|
|
13
13
|
|
|
14
14
|
|
|
15
15
|
|
|
16
16
|
Object.defineProperty(exports, "brands", {
|
|
17
17
|
enumerable: true,
|
|
18
|
-
get: function () { return
|
|
18
|
+
get: function () { return chunkJWTCEWQ4_cjs.brands; }
|
|
19
|
+
});
|
|
20
|
+
Object.defineProperty(exports, "defaultBrand", {
|
|
21
|
+
enumerable: true,
|
|
22
|
+
get: function () { return chunkX7S76WB7_cjs.defaultBrand; }
|
|
19
23
|
});
|
|
20
24
|
Object.defineProperty(exports, "enterpriseHealthBrand", {
|
|
21
25
|
enumerable: true,
|
|
@@ -33,14 +37,6 @@ Object.defineProperty(exports, "webchartBrand", {
|
|
|
33
37
|
enumerable: true,
|
|
34
38
|
get: function () { return chunkU7VQUOLS_cjs.webchartBrand; }
|
|
35
39
|
});
|
|
36
|
-
Object.defineProperty(exports, "ozwellBrand", {
|
|
37
|
-
enumerable: true,
|
|
38
|
-
get: function () { return chunkRR2MJBGV_cjs.ozwellBrand; }
|
|
39
|
-
});
|
|
40
|
-
Object.defineProperty(exports, "defaultBrand", {
|
|
41
|
-
enumerable: true,
|
|
42
|
-
get: function () { return chunkX7S76WB7_cjs.defaultBrand; }
|
|
43
|
-
});
|
|
44
40
|
Object.defineProperty(exports, "createBrandPreset", {
|
|
45
41
|
enumerable: true,
|
|
46
42
|
get: function () { return chunkJ644FU54_cjs.createBrandPreset; }
|
|
@@ -61,5 +57,9 @@ Object.defineProperty(exports, "ccmeBrand", {
|
|
|
61
57
|
enumerable: true,
|
|
62
58
|
get: function () { return chunkUCGUA3QV_cjs.ccmeBrand; }
|
|
63
59
|
});
|
|
60
|
+
Object.defineProperty(exports, "ozwellBrand", {
|
|
61
|
+
enumerable: true,
|
|
62
|
+
get: function () { return chunkRR2MJBGV_cjs.ozwellBrand; }
|
|
63
|
+
});
|
|
64
64
|
//# sourceMappingURL=index.cjs.map
|
|
65
65
|
//# sourceMappingURL=index.cjs.map
|
package/dist/brands/index.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
|
-
export { brands } from '../chunk-
|
|
1
|
+
export { brands } from '../chunk-TXRQQMG5.js';
|
|
2
|
+
export { defaultBrand } from '../chunk-PSTGFXQG.js';
|
|
2
3
|
export { enterpriseHealthBrand } from '../chunk-MTZPVOP6.js';
|
|
3
4
|
export { miewebBrand } from '../chunk-NERS5ZT6.js';
|
|
4
5
|
export { wagglelineBrand } from '../chunk-2NTYAALC.js';
|
|
5
6
|
export { webchartBrand } from '../chunk-CW66SO5O.js';
|
|
6
|
-
export { ozwellBrand } from '../chunk-5YUBQIC7.js';
|
|
7
|
-
export { defaultBrand } from '../chunk-PSTGFXQG.js';
|
|
8
7
|
export { createBrandPreset, generateBrandCSS, generateTailwindTheme } from '../chunk-WOYUQ4AT.js';
|
|
9
8
|
export { bluehiveBrand } from '../chunk-3T7QGLNB.js';
|
|
10
9
|
export { ccmeBrand } from '../chunk-SCQRJPSV.js';
|
|
10
|
+
export { ozwellBrand } from '../chunk-5YUBQIC7.js';
|
|
11
11
|
//# sourceMappingURL=index.js.map
|
|
12
12
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
import { cn } from './chunk-TQONQSJO.js';
|
|
2
|
+
import * as React from 'react';
|
|
3
|
+
import { cva } from 'class-variance-authority';
|
|
4
|
+
import { jsx, jsxs } from 'react/jsx-runtime';
|
|
5
|
+
|
|
6
|
+
var inputVariants = cva(
|
|
7
|
+
[
|
|
8
|
+
"w-full px-3 py-2",
|
|
9
|
+
"border border-input rounded-lg",
|
|
10
|
+
"bg-background text-foreground",
|
|
11
|
+
"placeholder:text-muted-foreground",
|
|
12
|
+
"transition-colors duration-200",
|
|
13
|
+
"focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent",
|
|
14
|
+
"disabled:cursor-not-allowed disabled:opacity-50"
|
|
15
|
+
],
|
|
16
|
+
{
|
|
17
|
+
variants: {
|
|
18
|
+
size: {
|
|
19
|
+
sm: "h-8 text-sm",
|
|
20
|
+
md: "h-10 text-base",
|
|
21
|
+
lg: "h-12 text-lg"
|
|
22
|
+
},
|
|
23
|
+
hasError: {
|
|
24
|
+
true: "border-destructive focus:ring-destructive",
|
|
25
|
+
false: ""
|
|
26
|
+
},
|
|
27
|
+
labelVariant: {
|
|
28
|
+
stacked: "",
|
|
29
|
+
floating: "peer placeholder:text-transparent"
|
|
30
|
+
}
|
|
31
|
+
},
|
|
32
|
+
compoundVariants: [
|
|
33
|
+
// Floating labels need extra height and asymmetric padding so both
|
|
34
|
+
// the floated label and the entered text fit inside the field.
|
|
35
|
+
{ labelVariant: "floating", size: "sm", className: "h-11 pt-4 pb-1" },
|
|
36
|
+
{ labelVariant: "floating", size: "md", className: "h-14 pt-5 pb-1.5" },
|
|
37
|
+
{ labelVariant: "floating", size: "lg", className: "h-16 pt-6 pb-2" }
|
|
38
|
+
],
|
|
39
|
+
defaultVariants: {
|
|
40
|
+
size: "md",
|
|
41
|
+
hasError: false,
|
|
42
|
+
labelVariant: "stacked"
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
);
|
|
46
|
+
var floatingGroupVariants = cva(
|
|
47
|
+
["relative rounded-lg border border-input bg-background px-3"],
|
|
48
|
+
{
|
|
49
|
+
variants: {
|
|
50
|
+
size: {
|
|
51
|
+
sm: "min-h-11 pt-4 pb-1",
|
|
52
|
+
md: "min-h-14 pt-5 pb-1.5",
|
|
53
|
+
lg: "min-h-16 pt-6 pb-2"
|
|
54
|
+
},
|
|
55
|
+
hasError: {
|
|
56
|
+
true: "border-destructive",
|
|
57
|
+
false: ""
|
|
58
|
+
}
|
|
59
|
+
},
|
|
60
|
+
defaultVariants: {
|
|
61
|
+
size: "md",
|
|
62
|
+
hasError: false
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
);
|
|
66
|
+
var floatingGroupLabelVariants = cva(
|
|
67
|
+
["absolute start-3 pointer-events-none select-none"],
|
|
68
|
+
{
|
|
69
|
+
variants: {
|
|
70
|
+
size: {
|
|
71
|
+
sm: "top-0.5 text-[0.65rem]",
|
|
72
|
+
md: "top-1 text-xs",
|
|
73
|
+
lg: "top-1.5 text-sm"
|
|
74
|
+
},
|
|
75
|
+
hasError: {
|
|
76
|
+
true: "text-destructive",
|
|
77
|
+
false: "text-muted-foreground"
|
|
78
|
+
}
|
|
79
|
+
},
|
|
80
|
+
defaultVariants: {
|
|
81
|
+
size: "md",
|
|
82
|
+
hasError: false
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
);
|
|
86
|
+
var floatingLabelVariants = cva(
|
|
87
|
+
[
|
|
88
|
+
"absolute start-3 pointer-events-none select-none",
|
|
89
|
+
"transition-all duration-200 ease-out",
|
|
90
|
+
// Rest state: vertically centered, placeholder-sized (input is empty and unfocused).
|
|
91
|
+
"top-1/2 -translate-y-1/2",
|
|
92
|
+
// Floated state: focused, has a value, or was autofilled → shrink and move to the top,
|
|
93
|
+
// staying inside the field.
|
|
94
|
+
"peer-focus:translate-y-0 peer-[:not(:placeholder-shown)]:translate-y-0 peer-autofill:translate-y-0"
|
|
95
|
+
],
|
|
96
|
+
{
|
|
97
|
+
variants: {
|
|
98
|
+
size: {
|
|
99
|
+
sm: [
|
|
100
|
+
"text-sm",
|
|
101
|
+
"peer-focus:top-0.5 peer-[:not(:placeholder-shown)]:top-0.5 peer-autofill:top-0.5",
|
|
102
|
+
"peer-focus:text-[0.65rem] peer-[:not(:placeholder-shown)]:text-[0.65rem] peer-autofill:text-[0.65rem]"
|
|
103
|
+
],
|
|
104
|
+
md: [
|
|
105
|
+
"text-base",
|
|
106
|
+
"peer-focus:top-1 peer-[:not(:placeholder-shown)]:top-1 peer-autofill:top-1",
|
|
107
|
+
"peer-focus:text-xs peer-[:not(:placeholder-shown)]:text-xs peer-autofill:text-xs"
|
|
108
|
+
],
|
|
109
|
+
lg: [
|
|
110
|
+
"text-lg",
|
|
111
|
+
"peer-focus:top-1.5 peer-[:not(:placeholder-shown)]:top-1.5 peer-autofill:top-1.5",
|
|
112
|
+
"peer-focus:text-sm peer-[:not(:placeholder-shown)]:text-sm peer-autofill:text-sm"
|
|
113
|
+
]
|
|
114
|
+
},
|
|
115
|
+
hasError: {
|
|
116
|
+
true: "text-destructive",
|
|
117
|
+
false: "text-muted-foreground"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
defaultVariants: {
|
|
121
|
+
size: "md",
|
|
122
|
+
hasError: false
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
);
|
|
126
|
+
function RequiredMark({
|
|
127
|
+
variant = "default"
|
|
128
|
+
}) {
|
|
129
|
+
return /* @__PURE__ */ jsx(
|
|
130
|
+
"span",
|
|
131
|
+
{
|
|
132
|
+
className: cn(
|
|
133
|
+
"ms-1",
|
|
134
|
+
variant === "warning" ? "text-warning" : "text-destructive"
|
|
135
|
+
),
|
|
136
|
+
"aria-hidden": "true",
|
|
137
|
+
children: "*"
|
|
138
|
+
}
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
var Input = React.forwardRef(
|
|
142
|
+
({
|
|
143
|
+
className,
|
|
144
|
+
size,
|
|
145
|
+
hasError,
|
|
146
|
+
error,
|
|
147
|
+
helperText,
|
|
148
|
+
label,
|
|
149
|
+
labelVariant = "stacked",
|
|
150
|
+
hideLabel,
|
|
151
|
+
required,
|
|
152
|
+
requiredVariant,
|
|
153
|
+
disabled,
|
|
154
|
+
id,
|
|
155
|
+
placeholder,
|
|
156
|
+
"aria-describedby": ariaDescribedBy,
|
|
157
|
+
...props
|
|
158
|
+
}, ref) => {
|
|
159
|
+
const generatedId = React.useId();
|
|
160
|
+
const inputId = id || generatedId;
|
|
161
|
+
const errorId = `${inputId}-error`;
|
|
162
|
+
const helperId = `${inputId}-helper`;
|
|
163
|
+
const describedByIds = [
|
|
164
|
+
error ? errorId : null,
|
|
165
|
+
helperText && !error ? helperId : null,
|
|
166
|
+
ariaDescribedBy
|
|
167
|
+
].filter(Boolean).join(" ");
|
|
168
|
+
const isFloating = labelVariant === "floating" && !!label && !hideLabel;
|
|
169
|
+
const requiredMark = required && /* @__PURE__ */ jsx(RequiredMark, { variant: requiredVariant });
|
|
170
|
+
const inputElement = /* @__PURE__ */ jsx(
|
|
171
|
+
"input",
|
|
172
|
+
{
|
|
173
|
+
"data-slot": "input",
|
|
174
|
+
id: inputId,
|
|
175
|
+
ref,
|
|
176
|
+
className: cn(
|
|
177
|
+
inputVariants({
|
|
178
|
+
size,
|
|
179
|
+
hasError: hasError || !!error,
|
|
180
|
+
labelVariant: isFloating ? "floating" : "stacked"
|
|
181
|
+
}),
|
|
182
|
+
className
|
|
183
|
+
),
|
|
184
|
+
"aria-invalid": hasError || !!error,
|
|
185
|
+
"aria-describedby": describedByIds || void 0,
|
|
186
|
+
required,
|
|
187
|
+
disabled,
|
|
188
|
+
placeholder: isFloating ? " " : placeholder,
|
|
189
|
+
...props
|
|
190
|
+
}
|
|
191
|
+
);
|
|
192
|
+
return /* @__PURE__ */ jsxs(
|
|
193
|
+
"div",
|
|
194
|
+
{
|
|
195
|
+
"data-slot": "input-wrapper",
|
|
196
|
+
className: cn("flex flex-col gap-1.5", disabled && "opacity-50"),
|
|
197
|
+
children: [
|
|
198
|
+
label && !isFloating && /* @__PURE__ */ jsxs(
|
|
199
|
+
"label",
|
|
200
|
+
{
|
|
201
|
+
"data-slot": "input-label",
|
|
202
|
+
htmlFor: inputId,
|
|
203
|
+
className: cn(
|
|
204
|
+
"text-foreground text-sm font-medium",
|
|
205
|
+
hideLabel && "sr-only"
|
|
206
|
+
),
|
|
207
|
+
children: [
|
|
208
|
+
label,
|
|
209
|
+
requiredMark
|
|
210
|
+
]
|
|
211
|
+
}
|
|
212
|
+
),
|
|
213
|
+
isFloating ? /* @__PURE__ */ jsxs("div", { className: "relative", children: [
|
|
214
|
+
inputElement,
|
|
215
|
+
/* @__PURE__ */ jsxs(
|
|
216
|
+
"label",
|
|
217
|
+
{
|
|
218
|
+
"data-slot": "input-label",
|
|
219
|
+
htmlFor: inputId,
|
|
220
|
+
className: floatingLabelVariants({
|
|
221
|
+
size,
|
|
222
|
+
hasError: hasError || !!error
|
|
223
|
+
}),
|
|
224
|
+
children: [
|
|
225
|
+
label,
|
|
226
|
+
requiredMark
|
|
227
|
+
]
|
|
228
|
+
}
|
|
229
|
+
)
|
|
230
|
+
] }) : inputElement,
|
|
231
|
+
error && /* @__PURE__ */ jsx(
|
|
232
|
+
"p",
|
|
233
|
+
{
|
|
234
|
+
id: errorId,
|
|
235
|
+
"data-slot": "input-error",
|
|
236
|
+
className: "text-destructive-700 dark:text-destructive-400 text-sm",
|
|
237
|
+
role: "alert",
|
|
238
|
+
children: error
|
|
239
|
+
}
|
|
240
|
+
),
|
|
241
|
+
helperText && !error && /* @__PURE__ */ jsx(
|
|
242
|
+
"p",
|
|
243
|
+
{
|
|
244
|
+
id: helperId,
|
|
245
|
+
"data-slot": "input-helper",
|
|
246
|
+
className: "text-muted-foreground text-sm",
|
|
247
|
+
children: helperText
|
|
248
|
+
}
|
|
249
|
+
)
|
|
250
|
+
]
|
|
251
|
+
}
|
|
252
|
+
);
|
|
253
|
+
}
|
|
254
|
+
);
|
|
255
|
+
Input.displayName = "Input";
|
|
256
|
+
|
|
257
|
+
export { Input, RequiredMark, floatingGroupLabelVariants, floatingGroupVariants, floatingLabelVariants, inputVariants };
|
|
258
|
+
//# sourceMappingURL=chunk-3IMM2PM4.js.map
|
|
259
|
+
//# sourceMappingURL=chunk-3IMM2PM4.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/Input/Input.tsx"],"names":[],"mappings":"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","file":"chunk-3IMM2PM4.js","sourcesContent":["import * as React from 'react';\nimport { cva, type VariantProps } from 'class-variance-authority';\nimport { cn } from '../../utils/cn';\n\nconst inputVariants = cva(\n [\n 'w-full px-3 py-2',\n 'border border-input rounded-lg',\n 'bg-background text-foreground',\n 'placeholder:text-muted-foreground',\n 'transition-colors duration-200',\n 'focus:outline-none focus:ring-2 focus:ring-ring focus:border-transparent',\n 'disabled:cursor-not-allowed disabled:opacity-50',\n ],\n {\n variants: {\n size: {\n sm: 'h-8 text-sm',\n md: 'h-10 text-base',\n lg: 'h-12 text-lg',\n },\n hasError: {\n true: 'border-destructive focus:ring-destructive',\n false: '',\n },\n labelVariant: {\n stacked: '',\n floating: 'peer placeholder:text-transparent',\n },\n },\n compoundVariants: [\n // Floating labels need extra height and asymmetric padding so both\n // the floated label and the entered text fit inside the field.\n { labelVariant: 'floating', size: 'sm', className: 'h-11 pt-4 pb-1' },\n { labelVariant: 'floating', size: 'md', className: 'h-14 pt-5 pb-1.5' },\n { labelVariant: 'floating', size: 'lg', className: 'h-16 pt-6 pb-2' },\n ],\n defaultVariants: {\n size: 'md',\n hasError: false,\n labelVariant: 'stacked',\n },\n }\n);\n\n// Bordered field box for group controls (RadioGroup / CheckboxGroup) rendered\n// with labelVariant=\"floating\". Mirrors the floating input's box metrics so\n// mixed forms stay vertically aligned.\nconst floatingGroupVariants = cva(\n ['relative rounded-lg border border-input bg-background px-3'],\n {\n variants: {\n size: {\n sm: 'min-h-11 pt-4 pb-1',\n md: 'min-h-14 pt-5 pb-1.5',\n lg: 'min-h-16 pt-6 pb-2',\n },\n hasError: {\n true: 'border-destructive',\n false: '',\n },\n },\n defaultVariants: {\n size: 'md',\n hasError: false,\n },\n }\n);\n\n// Group label fixed in the floated position (groups have no empty state to\n// float from, so the label never animates). Metrics match the floated state\n// of floatingLabelVariants.\nconst floatingGroupLabelVariants = cva(\n ['absolute start-3 pointer-events-none select-none'],\n {\n variants: {\n size: {\n sm: 'top-0.5 text-[0.65rem]',\n md: 'top-1 text-xs',\n lg: 'top-1.5 text-sm',\n },\n hasError: {\n true: 'text-destructive',\n false: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n hasError: false,\n },\n }\n);\n\nconst floatingLabelVariants = cva(\n [\n 'absolute start-3 pointer-events-none select-none',\n 'transition-all duration-200 ease-out',\n // Rest state: vertically centered, placeholder-sized (input is empty and unfocused).\n 'top-1/2 -translate-y-1/2',\n // Floated state: focused, has a value, or was autofilled → shrink and move to the top,\n // staying inside the field.\n 'peer-focus:translate-y-0 peer-[:not(:placeholder-shown)]:translate-y-0 peer-autofill:translate-y-0',\n ],\n {\n variants: {\n size: {\n sm: [\n 'text-sm',\n 'peer-focus:top-0.5 peer-[:not(:placeholder-shown)]:top-0.5 peer-autofill:top-0.5',\n 'peer-focus:text-[0.65rem] peer-[:not(:placeholder-shown)]:text-[0.65rem] peer-autofill:text-[0.65rem]',\n ],\n md: [\n 'text-base',\n 'peer-focus:top-1 peer-[:not(:placeholder-shown)]:top-1 peer-autofill:top-1',\n 'peer-focus:text-xs peer-[:not(:placeholder-shown)]:text-xs peer-autofill:text-xs',\n ],\n lg: [\n 'text-lg',\n 'peer-focus:top-1.5 peer-[:not(:placeholder-shown)]:top-1.5 peer-autofill:top-1.5',\n 'peer-focus:text-sm peer-[:not(:placeholder-shown)]:text-sm peer-autofill:text-sm',\n ],\n },\n hasError: {\n true: 'text-destructive',\n false: 'text-muted-foreground',\n },\n },\n defaultVariants: {\n size: 'md',\n hasError: false,\n },\n }\n);\n\nexport interface InputProps\n extends\n Omit<React.InputHTMLAttributes<HTMLInputElement>, 'size'>,\n Omit<VariantProps<typeof inputVariants>, 'labelVariant'> {\n /** Error message to display below the input */\n error?: string;\n /** Helper text to display below the input */\n helperText?: string;\n /** Label for the input */\n label?: string;\n /**\n * How the label is rendered.\n * - `stacked` (default): label above the input.\n * - `floating`: label rests inside the input like a placeholder and floats\n * to the top of the field (staying inside it) when focused or filled.\n * Ignores `placeholder`; when `hideLabel` is set, falls back to a\n * visually-hidden stacked label.\n */\n labelVariant?: 'stacked' | 'floating';\n /** Whether the label should be visually hidden (still accessible) */\n hideLabel?: boolean;\n /** Whether the input is required */\n required?: boolean;\n /**\n * Color of the required asterisk.\n * - `default`: destructive (hard requirement).\n * - `warning`: warning color (soft requirement / recommended).\n */\n requiredVariant?: RequiredMarkVariant;\n}\n\ntype RequiredMarkVariant = 'default' | 'warning';\n\n/** Asterisk rendered next to a label when the field is required. */\nfunction RequiredMark({\n variant = 'default',\n}: {\n variant?: RequiredMarkVariant;\n}) {\n return (\n <span\n className={cn(\n 'ms-1',\n variant === 'warning' ? 'text-warning' : 'text-destructive'\n )}\n aria-hidden=\"true\"\n >\n *\n </span>\n );\n}\n\n/**\n * A styled input component with support for labels, errors, and helper text.\n *\n * @example\n * ```tsx\n * <Input label=\"Email\" type=\"email\" placeholder=\"you@example.com\" />\n * <Input label=\"Password\" type=\"password\" error=\"Password is required\" hasError />\n * <Input label=\"Account number\" labelVariant=\"floating\" />\n * ```\n */\nconst Input = React.forwardRef<HTMLInputElement, InputProps>(\n (\n {\n className,\n size,\n hasError,\n error,\n helperText,\n label,\n labelVariant = 'stacked',\n hideLabel,\n required,\n requiredVariant,\n disabled,\n id,\n placeholder,\n 'aria-describedby': ariaDescribedBy,\n ...props\n },\n ref\n ) => {\n const generatedId = React.useId();\n const inputId = id || generatedId;\n const errorId = `${inputId}-error`;\n const helperId = `${inputId}-helper`;\n\n const describedByIds = [\n error ? errorId : null,\n helperText && !error ? helperId : null,\n ariaDescribedBy,\n ]\n .filter(Boolean)\n .join(' ');\n\n const isFloating = labelVariant === 'floating' && !!label && !hideLabel;\n\n const requiredMark = required && <RequiredMark variant={requiredVariant} />;\n\n const inputElement = (\n <input\n data-slot=\"input\"\n id={inputId}\n ref={ref}\n className={cn(\n inputVariants({\n size,\n hasError: hasError || !!error,\n labelVariant: isFloating ? 'floating' : 'stacked',\n }),\n className\n )}\n aria-invalid={hasError || !!error}\n aria-describedby={describedByIds || undefined}\n required={required}\n disabled={disabled}\n // A single-space placeholder keeps :placeholder-shown reliable so the\n // label can float via CSS alone; a user placeholder would clash with\n // the resting label.\n placeholder={isFloating ? ' ' : placeholder}\n {...props}\n />\n );\n\n return (\n <div\n data-slot=\"input-wrapper\"\n className={cn('flex flex-col gap-1.5', disabled && 'opacity-50')}\n >\n {label && !isFloating && (\n <label\n data-slot=\"input-label\"\n htmlFor={inputId}\n className={cn(\n 'text-foreground text-sm font-medium',\n hideLabel && 'sr-only'\n )}\n >\n {label}\n {requiredMark}\n </label>\n )}\n {isFloating ? (\n <div className=\"relative\">\n {inputElement}\n <label\n data-slot=\"input-label\"\n htmlFor={inputId}\n className={floatingLabelVariants({\n size,\n hasError: hasError || !!error,\n })}\n >\n {label}\n {requiredMark}\n </label>\n </div>\n ) : (\n inputElement\n )}\n {error && (\n <p\n id={errorId}\n data-slot=\"input-error\"\n className=\"text-destructive-700 dark:text-destructive-400 text-sm\"\n role=\"alert\"\n >\n {error}\n </p>\n )}\n {helperText && !error && (\n <p\n id={helperId}\n data-slot=\"input-helper\"\n className=\"text-muted-foreground text-sm\"\n >\n {helperText}\n </p>\n )}\n </div>\n );\n }\n);\n\nInput.displayName = 'Input';\n\nexport {\n Input,\n RequiredMark,\n inputVariants,\n floatingLabelVariants,\n floatingGroupVariants,\n floatingGroupLabelVariants,\n};\nexport type { RequiredMarkVariant };\n"]}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkP2VTQ5AR_cjs = require('./chunk-P2VTQ5AR.cjs');
|
|
4
|
+
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
5
|
+
var React = require('react');
|
|
6
|
+
var lucideReact = require('lucide-react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
|
+
|
|
29
|
+
var Kbd = React__namespace.forwardRef(function Kbd2({ className, ...props }, ref) {
|
|
30
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
31
|
+
"kbd",
|
|
32
|
+
{
|
|
33
|
+
ref,
|
|
34
|
+
className: chunkS5RVSXDV_cjs.cn(
|
|
35
|
+
"border-border bg-muted text-foreground rounded border px-1.5 py-0.5 font-mono text-[11px]",
|
|
36
|
+
className
|
|
37
|
+
),
|
|
38
|
+
...props
|
|
39
|
+
}
|
|
40
|
+
);
|
|
41
|
+
});
|
|
42
|
+
function Keys({
|
|
43
|
+
keys,
|
|
44
|
+
alternativesLabel
|
|
45
|
+
}) {
|
|
46
|
+
const list = Array.isArray(keys) ? keys : keys.split(" / ");
|
|
47
|
+
return /* @__PURE__ */ jsxRuntime.jsx("span", { className: "flex shrink-0 items-center gap-1", children: list.map((k, i) => /* @__PURE__ */ jsxRuntime.jsxs(React__namespace.Fragment, { children: [
|
|
48
|
+
/* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: k }),
|
|
49
|
+
i < list.length - 1 && /* @__PURE__ */ jsxRuntime.jsx("span", { className: "text-muted-foreground mx-0.5 text-xs", children: alternativesLabel })
|
|
50
|
+
] }, `${k}-${i}`)) });
|
|
51
|
+
}
|
|
52
|
+
function ShortcutList({
|
|
53
|
+
shortcuts,
|
|
54
|
+
alternativesLabel
|
|
55
|
+
}) {
|
|
56
|
+
return /* @__PURE__ */ jsxRuntime.jsx("ul", { className: "flex list-none flex-col gap-2 p-0", children: shortcuts.map((s) => /* @__PURE__ */ jsxRuntime.jsxs(
|
|
57
|
+
"li",
|
|
58
|
+
{
|
|
59
|
+
className: "text-foreground flex items-center justify-between gap-4 text-sm",
|
|
60
|
+
children: [
|
|
61
|
+
/* @__PURE__ */ jsxRuntime.jsx("span", { className: "min-w-0", children: s.description }),
|
|
62
|
+
/* @__PURE__ */ jsxRuntime.jsx(Keys, { keys: s.keys, alternativesLabel })
|
|
63
|
+
]
|
|
64
|
+
},
|
|
65
|
+
`${s.description}-${String(s.keys)}`
|
|
66
|
+
)) });
|
|
67
|
+
}
|
|
68
|
+
function KeyboardShortcutsOverlay({
|
|
69
|
+
open,
|
|
70
|
+
onClose,
|
|
71
|
+
shortcuts,
|
|
72
|
+
groups,
|
|
73
|
+
title = "Keyboard shortcuts",
|
|
74
|
+
hint,
|
|
75
|
+
alternativesLabel = "or"
|
|
76
|
+
}) {
|
|
77
|
+
const defaultHint = /* @__PURE__ */ jsxRuntime.jsxs(jsxRuntime.Fragment, { children: [
|
|
78
|
+
"Press ",
|
|
79
|
+
/* @__PURE__ */ jsxRuntime.jsx(Kbd, { children: "?" }),
|
|
80
|
+
" anytime to toggle this help"
|
|
81
|
+
] });
|
|
82
|
+
const footer = hint === null ? null : hint ?? defaultHint;
|
|
83
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
84
|
+
chunkP2VTQ5AR_cjs.Modal,
|
|
85
|
+
{
|
|
86
|
+
open,
|
|
87
|
+
onOpenChange: (o) => {
|
|
88
|
+
if (!o) onClose();
|
|
89
|
+
},
|
|
90
|
+
size: "sm",
|
|
91
|
+
"aria-label": title,
|
|
92
|
+
children: [
|
|
93
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkP2VTQ5AR_cjs.ModalHeader, { children: [
|
|
94
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkP2VTQ5AR_cjs.ModalTitle, { className: "flex items-center gap-2 text-sm", children: [
|
|
95
|
+
/* @__PURE__ */ jsxRuntime.jsx(lucideReact.Keyboard, { "aria-hidden": "true", className: "text-primary-500 h-4 w-4" }),
|
|
96
|
+
title
|
|
97
|
+
] }),
|
|
98
|
+
/* @__PURE__ */ jsxRuntime.jsx(chunkP2VTQ5AR_cjs.ModalClose, {})
|
|
99
|
+
] }),
|
|
100
|
+
/* @__PURE__ */ jsxRuntime.jsxs(chunkP2VTQ5AR_cjs.ModalBody, { className: "flex flex-col gap-4", children: [
|
|
101
|
+
shortcuts && /* @__PURE__ */ jsxRuntime.jsx(
|
|
102
|
+
ShortcutList,
|
|
103
|
+
{
|
|
104
|
+
shortcuts,
|
|
105
|
+
alternativesLabel
|
|
106
|
+
}
|
|
107
|
+
),
|
|
108
|
+
groups?.map((group) => /* @__PURE__ */ jsxRuntime.jsxs("div", { className: "flex flex-col gap-2", children: [
|
|
109
|
+
/* @__PURE__ */ jsxRuntime.jsx("h3", { className: "text-muted-foreground text-xs font-semibold tracking-wide uppercase", children: group.title }),
|
|
110
|
+
/* @__PURE__ */ jsxRuntime.jsx(
|
|
111
|
+
ShortcutList,
|
|
112
|
+
{
|
|
113
|
+
shortcuts: group.shortcuts,
|
|
114
|
+
alternativesLabel
|
|
115
|
+
}
|
|
116
|
+
)
|
|
117
|
+
] }, group.title))
|
|
118
|
+
] }),
|
|
119
|
+
footer && /* @__PURE__ */ jsxRuntime.jsx(chunkP2VTQ5AR_cjs.ModalFooter, { className: "text-muted-foreground justify-center text-[11px]", children: /* @__PURE__ */ jsxRuntime.jsx("span", { children: footer }) })
|
|
120
|
+
]
|
|
121
|
+
}
|
|
122
|
+
);
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
exports.Kbd = Kbd;
|
|
126
|
+
exports.KeyboardShortcutsOverlay = KeyboardShortcutsOverlay;
|
|
127
|
+
//# sourceMappingURL=chunk-3SHLOF4V.cjs.map
|
|
128
|
+
//# sourceMappingURL=chunk-3SHLOF4V.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/KeyboardShortcutsOverlay/KeyboardShortcutsOverlay.tsx"],"names":["React","Kbd","jsx","cn","jsxs","Fragment","Modal","ModalHeader","ModalTitle","Keyboard","ModalClose","ModalBody","ModalFooter"],"mappings":"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","file":"chunk-3SHLOF4V.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { Keyboard } from 'lucide-react';\nimport { cn } from '../../utils/cn';\nimport {\n Modal,\n ModalHeader,\n ModalTitle,\n ModalClose,\n ModalBody,\n ModalFooter,\n} from '../Modal';\n\n// =============================================================================\n// Kbd\n// =============================================================================\n\nexport type KbdProps = React.HTMLAttributes<HTMLElement>;\n\n/** A keyboard-key chip: `<Kbd>⌘K</Kbd>`. */\nexport const Kbd = React.forwardRef<HTMLElement, KbdProps>(function Kbd(\n { className, ...props },\n ref\n) {\n return (\n <kbd\n ref={ref}\n className={cn(\n 'border-border bg-muted text-foreground rounded border px-1.5 py-0.5 font-mono text-[11px]',\n className\n )}\n {...props}\n />\n );\n});\n\n// =============================================================================\n// KeyboardShortcutsOverlay\n// =============================================================================\n\nexport interface ShortcutDef {\n /** Key or alternatives — `\"j\"`, `[\"j\", \"↓\"]`, `\"⌘K\"`. */\n keys: string | string[];\n description: string;\n}\n\nexport interface ShortcutGroup {\n title: string;\n shortcuts: ShortcutDef[];\n}\n\nexport interface KeyboardShortcutsOverlayProps {\n open: boolean;\n onClose: () => void;\n /** Flat list of shortcuts, or use `groups` for sectioned help. */\n shortcuts?: ShortcutDef[];\n /** Sectioned shortcuts with group headings. */\n groups?: ShortcutGroup[];\n title?: string;\n /** Footer hint. Pass `null` to hide it. */\n hint?: React.ReactNode | null;\n /** Joins key alternatives (default \"or\"), overridable for i18n. */\n alternativesLabel?: string;\n}\n\nfunction Keys({\n keys,\n alternativesLabel,\n}: {\n keys: string | string[];\n alternativesLabel: string;\n}) {\n const list = Array.isArray(keys) ? keys : keys.split(' / ');\n return (\n <span className=\"flex shrink-0 items-center gap-1\">\n {list.map((k, i) => (\n <React.Fragment key={`${k}-${i}`}>\n <Kbd>{k}</Kbd>\n {i < list.length - 1 && (\n <span className=\"text-muted-foreground mx-0.5 text-xs\">\n {alternativesLabel}\n </span>\n )}\n </React.Fragment>\n ))}\n </span>\n );\n}\n\nfunction ShortcutList({\n shortcuts,\n alternativesLabel,\n}: {\n shortcuts: ShortcutDef[];\n alternativesLabel: string;\n}) {\n return (\n <ul className=\"flex list-none flex-col gap-2 p-0\">\n {shortcuts.map((s) => (\n <li\n key={`${s.description}-${String(s.keys)}`}\n className=\"text-foreground flex items-center justify-between gap-4 text-sm\"\n >\n <span className=\"min-w-0\">{s.description}</span>\n <Keys keys={s.keys} alternativesLabel={alternativesLabel} />\n </li>\n ))}\n </ul>\n );\n}\n\n/**\n * The `?` keyboard-shortcuts help dialog: a list of shortcut rows\n * (optionally grouped) with `Kbd` chips for each key. Pairs with the\n * `useKeyboardShortcut` hook, which handles the binding — this component\n * only renders the help.\n *\n * @example\n * ```tsx\n * const [open, setOpen] = useState(false);\n * useKeyboardShortcut('?', () => setOpen((v) => !v), {\n * modifiers: { shift: true },\n * });\n *\n * <KeyboardShortcutsOverlay\n * open={open}\n * onClose={() => setOpen(false)}\n * shortcuts={[\n * { keys: ['j', '↓'], description: 'Next record' },\n * { keys: '⌘K', description: 'Command palette' },\n * ]}\n * />\n * ```\n */\nexport function KeyboardShortcutsOverlay({\n open,\n onClose,\n shortcuts,\n groups,\n title = 'Keyboard shortcuts',\n hint,\n alternativesLabel = 'or',\n}: KeyboardShortcutsOverlayProps) {\n const defaultHint = (\n <>\n Press <Kbd>?</Kbd> anytime to toggle this help\n </>\n );\n const footer = hint === null ? null : (hint ?? defaultHint);\n\n return (\n <Modal\n open={open}\n onOpenChange={(o) => {\n if (!o) onClose();\n }}\n size=\"sm\"\n aria-label={title}\n >\n <ModalHeader>\n <ModalTitle className=\"flex items-center gap-2 text-sm\">\n <Keyboard aria-hidden=\"true\" className=\"text-primary-500 h-4 w-4\" />\n {title}\n </ModalTitle>\n <ModalClose />\n </ModalHeader>\n <ModalBody className=\"flex flex-col gap-4\">\n {shortcuts && (\n <ShortcutList\n shortcuts={shortcuts}\n alternativesLabel={alternativesLabel}\n />\n )}\n {groups?.map((group) => (\n <div key={group.title} className=\"flex flex-col gap-2\">\n <h3 className=\"text-muted-foreground text-xs font-semibold tracking-wide uppercase\">\n {group.title}\n </h3>\n <ShortcutList\n shortcuts={group.shortcuts}\n alternativesLabel={alternativesLabel}\n />\n </div>\n ))}\n </ModalBody>\n {footer && (\n <ModalFooter className=\"text-muted-foreground justify-center text-[11px]\">\n <span>{footer}</span>\n </ModalFooter>\n )}\n </Modal>\n );\n}\n"]}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var chunkS5RVSXDV_cjs = require('./chunk-S5RVSXDV.cjs');
|
|
4
|
+
var React = require('react');
|
|
5
|
+
var luxon = require('luxon');
|
|
6
|
+
var lucideReact = require('lucide-react');
|
|
7
|
+
var jsxRuntime = require('react/jsx-runtime');
|
|
8
|
+
|
|
9
|
+
function _interopNamespace(e) {
|
|
10
|
+
if (e && e.__esModule) return e;
|
|
11
|
+
var n = Object.create(null);
|
|
12
|
+
if (e) {
|
|
13
|
+
Object.keys(e).forEach(function (k) {
|
|
14
|
+
if (k !== 'default') {
|
|
15
|
+
var d = Object.getOwnPropertyDescriptor(e, k);
|
|
16
|
+
Object.defineProperty(n, k, d.get ? d : {
|
|
17
|
+
enumerable: true,
|
|
18
|
+
get: function () { return e[k]; }
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
});
|
|
22
|
+
}
|
|
23
|
+
n.default = e;
|
|
24
|
+
return Object.freeze(n);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
var React__namespace = /*#__PURE__*/_interopNamespace(React);
|
|
28
|
+
|
|
29
|
+
var DEFAULT_THRESHOLDS = { fresh: 90, aging: 180 };
|
|
30
|
+
function toDateTime(date) {
|
|
31
|
+
return typeof date === "string" ? luxon.DateTime.fromISO(date) : luxon.DateTime.fromJSDate(date);
|
|
32
|
+
}
|
|
33
|
+
function daysSince(date) {
|
|
34
|
+
const dt = toDateTime(date);
|
|
35
|
+
if (!dt.isValid) return null;
|
|
36
|
+
const days = Math.floor(luxon.DateTime.now().diff(dt, "days").days);
|
|
37
|
+
return Math.max(0, days);
|
|
38
|
+
}
|
|
39
|
+
function levelForDays(days, thresholds) {
|
|
40
|
+
if (days === null) return "unknown";
|
|
41
|
+
if (days < thresholds.fresh) return "fresh";
|
|
42
|
+
if (days < thresholds.aging) return "aging";
|
|
43
|
+
return "stale";
|
|
44
|
+
}
|
|
45
|
+
function freshnessLevel(date, thresholds = DEFAULT_THRESHOLDS) {
|
|
46
|
+
return levelForDays(daysSince(date), thresholds);
|
|
47
|
+
}
|
|
48
|
+
function ageText(days) {
|
|
49
|
+
if (days === null) return "date unknown";
|
|
50
|
+
return days === 0 ? "today" : days === 1 ? "yesterday" : `${days}d ago`;
|
|
51
|
+
}
|
|
52
|
+
var META = {
|
|
53
|
+
fresh: {
|
|
54
|
+
Icon: lucideReact.CircleCheck,
|
|
55
|
+
chip: "bg-success/10 text-success-800 dark:bg-success/20 dark:text-success",
|
|
56
|
+
dot: "bg-success",
|
|
57
|
+
label: "Fresh"
|
|
58
|
+
},
|
|
59
|
+
aging: {
|
|
60
|
+
Icon: lucideReact.CircleMinus,
|
|
61
|
+
chip: "bg-warning/15 text-warning-800 dark:bg-warning/20 dark:text-warning",
|
|
62
|
+
dot: "bg-warning",
|
|
63
|
+
label: "Aging"
|
|
64
|
+
},
|
|
65
|
+
stale: {
|
|
66
|
+
Icon: lucideReact.CircleAlert,
|
|
67
|
+
chip: "bg-destructive/10 text-destructive-700 dark:bg-destructive/20 dark:text-destructive",
|
|
68
|
+
dot: "bg-destructive",
|
|
69
|
+
label: "Stale"
|
|
70
|
+
},
|
|
71
|
+
unknown: {
|
|
72
|
+
Icon: lucideReact.CircleHelp,
|
|
73
|
+
chip: "bg-muted text-muted-foreground",
|
|
74
|
+
dot: "bg-muted-foreground/50",
|
|
75
|
+
label: "Unknown"
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
var FreshnessBadge = React__namespace.forwardRef(function FreshnessBadge2({
|
|
79
|
+
date,
|
|
80
|
+
thresholds = DEFAULT_THRESHOLDS,
|
|
81
|
+
label = "Reviewed",
|
|
82
|
+
className,
|
|
83
|
+
...props
|
|
84
|
+
}, ref) {
|
|
85
|
+
const days = daysSince(date);
|
|
86
|
+
const level = levelForDays(days, thresholds);
|
|
87
|
+
const { Icon, chip } = META[level];
|
|
88
|
+
return /* @__PURE__ */ jsxRuntime.jsxs(
|
|
89
|
+
"span",
|
|
90
|
+
{
|
|
91
|
+
ref,
|
|
92
|
+
className: chunkS5RVSXDV_cjs.cn(
|
|
93
|
+
"inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-semibold",
|
|
94
|
+
chip,
|
|
95
|
+
className
|
|
96
|
+
),
|
|
97
|
+
...props,
|
|
98
|
+
children: [
|
|
99
|
+
/* @__PURE__ */ jsxRuntime.jsx(Icon, { "aria-hidden": "true", className: "h-3 w-3 shrink-0" }),
|
|
100
|
+
label,
|
|
101
|
+
" ",
|
|
102
|
+
ageText(days)
|
|
103
|
+
]
|
|
104
|
+
}
|
|
105
|
+
);
|
|
106
|
+
});
|
|
107
|
+
var FreshnessDot = React__namespace.forwardRef(function FreshnessDot2({
|
|
108
|
+
date,
|
|
109
|
+
thresholds = DEFAULT_THRESHOLDS,
|
|
110
|
+
label = "Reviewed",
|
|
111
|
+
className,
|
|
112
|
+
...props
|
|
113
|
+
}, ref) {
|
|
114
|
+
const days = daysSince(date);
|
|
115
|
+
const level = levelForDays(days, thresholds);
|
|
116
|
+
const description = `${META[level].label} \u2014 ${label} ${ageText(days)}`;
|
|
117
|
+
return /* @__PURE__ */ jsxRuntime.jsx(
|
|
118
|
+
"span",
|
|
119
|
+
{
|
|
120
|
+
ref,
|
|
121
|
+
role: "img",
|
|
122
|
+
"aria-label": description,
|
|
123
|
+
title: description,
|
|
124
|
+
className: chunkS5RVSXDV_cjs.cn(
|
|
125
|
+
"inline-block h-2 w-2 shrink-0 rounded-full",
|
|
126
|
+
META[level].dot,
|
|
127
|
+
className
|
|
128
|
+
),
|
|
129
|
+
...props
|
|
130
|
+
}
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
exports.FreshnessBadge = FreshnessBadge;
|
|
135
|
+
exports.FreshnessDot = FreshnessDot;
|
|
136
|
+
exports.daysSince = daysSince;
|
|
137
|
+
exports.freshnessLevel = freshnessLevel;
|
|
138
|
+
//# sourceMappingURL=chunk-3TXOFAXP.cjs.map
|
|
139
|
+
//# sourceMappingURL=chunk-3TXOFAXP.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/components/FreshnessBadge/FreshnessBadge.tsx"],"names":["DateTime","CircleCheck","CircleMinus","CircleAlert","CircleHelp","React","FreshnessBadge","jsxs","cn","jsx","FreshnessDot"],"mappings":"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","file":"chunk-3TXOFAXP.cjs","sourcesContent":["'use client';\n\nimport * as React from 'react';\nimport { DateTime } from 'luxon';\nimport {\n CircleAlert,\n CircleCheck,\n CircleHelp,\n CircleMinus,\n} from 'lucide-react';\nimport { cn } from '../../utils/cn';\n\n// =============================================================================\n// Types & helpers\n// =============================================================================\n\nexport type FreshnessLevel = 'fresh' | 'aging' | 'stale' | 'unknown';\n\nexport interface FreshnessThresholds {\n /** Days within which a date counts as fresh (default 90). */\n fresh: number;\n /** Days within which a date counts as aging; beyond is stale (default 180). */\n aging: number;\n}\n\nconst DEFAULT_THRESHOLDS: FreshnessThresholds = { fresh: 90, aging: 180 };\n\nfunction toDateTime(date: string | Date): DateTime {\n return typeof date === 'string'\n ? DateTime.fromISO(date)\n : DateTime.fromJSDate(date);\n}\n\n/**\n * Whole days elapsed since the given date (0 for today/future), or `null`\n * when the date cannot be parsed.\n */\nexport function daysSince(date: string | Date): number | null {\n const dt = toDateTime(date);\n if (!dt.isValid) return null;\n const days = Math.floor(DateTime.now().diff(dt, 'days').days);\n return Math.max(0, days);\n}\n\nfunction levelForDays(\n days: number | null,\n thresholds: FreshnessThresholds\n): FreshnessLevel {\n if (days === null) return 'unknown';\n if (days < thresholds.fresh) return 'fresh';\n if (days < thresholds.aging) return 'aging';\n return 'stale';\n}\n\n/**\n * Bucket a date into fresh / aging / stale by day thresholds. Unparseable\n * dates return `unknown` rather than masquerading as fresh or stale.\n */\nexport function freshnessLevel(\n date: string | Date,\n thresholds: FreshnessThresholds = DEFAULT_THRESHOLDS\n): FreshnessLevel {\n return levelForDays(daysSince(date), thresholds);\n}\n\nfunction ageText(days: number | null): string {\n if (days === null) return 'date unknown';\n return days === 0 ? 'today' : days === 1 ? 'yesterday' : `${days}d ago`;\n}\n\nconst META: Record<\n FreshnessLevel,\n { Icon: typeof CircleCheck; chip: string; dot: string; label: string }\n> = {\n fresh: {\n Icon: CircleCheck,\n chip: 'bg-success/10 text-success-800 dark:bg-success/20 dark:text-success',\n dot: 'bg-success',\n label: 'Fresh',\n },\n aging: {\n Icon: CircleMinus,\n chip: 'bg-warning/15 text-warning-800 dark:bg-warning/20 dark:text-warning',\n dot: 'bg-warning',\n label: 'Aging',\n },\n stale: {\n Icon: CircleAlert,\n chip: 'bg-destructive/10 text-destructive-700 dark:bg-destructive/20 dark:text-destructive',\n dot: 'bg-destructive',\n label: 'Stale',\n },\n unknown: {\n Icon: CircleHelp,\n chip: 'bg-muted text-muted-foreground',\n dot: 'bg-muted-foreground/50',\n label: 'Unknown',\n },\n};\n\n// =============================================================================\n// Components\n// =============================================================================\n\nexport interface FreshnessBadgeProps extends React.HTMLAttributes<HTMLSpanElement> {\n /** The date being aged — last review, last sync, last update. */\n date: string | Date;\n /** Day cutoffs for fresh/aging (default 90/180). */\n thresholds?: FreshnessThresholds;\n /** Verb before the age (default \"Reviewed\"). */\n label?: string;\n}\n\n/**\n * A recency chip that ages from success through warning to destructive:\n * \"Reviewed 12d ago\". Suits source registries, sync statuses, data-quality\n * dashboards — anywhere staleness is a signal.\n *\n * @example\n * ```tsx\n * <FreshnessBadge date=\"2026-07-01\" />\n * <FreshnessBadge date={lastSync} label=\"Synced\" thresholds={{ fresh: 1, aging: 7 }} />\n * ```\n */\nexport const FreshnessBadge = React.forwardRef<\n HTMLSpanElement,\n FreshnessBadgeProps\n>(function FreshnessBadge(\n {\n date,\n thresholds = DEFAULT_THRESHOLDS,\n label = 'Reviewed',\n className,\n ...props\n },\n ref\n) {\n const days = daysSince(date);\n const level = levelForDays(days, thresholds);\n const { Icon, chip } = META[level];\n return (\n <span\n ref={ref}\n className={cn(\n 'inline-flex items-center gap-1 rounded-full px-2 py-0.5 text-[11px] font-semibold',\n chip,\n className\n )}\n {...props}\n >\n <Icon aria-hidden=\"true\" className=\"h-3 w-3 shrink-0\" />\n {label} {ageText(days)}\n </span>\n );\n});\n\nexport interface FreshnessDotProps extends React.HTMLAttributes<HTMLSpanElement> {\n date: string | Date;\n thresholds?: FreshnessThresholds;\n /** Verb used in the accessible label and tooltip (default \"Reviewed\"). */\n label?: string;\n}\n\n/** Colored dot for tight spots — table cells, tooltip source rows. */\nexport const FreshnessDot = React.forwardRef<\n HTMLSpanElement,\n FreshnessDotProps\n>(function FreshnessDot(\n {\n date,\n thresholds = DEFAULT_THRESHOLDS,\n label = 'Reviewed',\n className,\n ...props\n },\n ref\n) {\n const days = daysSince(date);\n const level = levelForDays(days, thresholds);\n const description = `${META[level].label} — ${label} ${ageText(days)}`;\n return (\n <span\n ref={ref}\n role=\"img\"\n aria-label={description}\n title={description}\n className={cn(\n 'inline-block h-2 w-2 shrink-0 rounded-full',\n META[level].dot,\n className\n )}\n {...props}\n />\n );\n});\n"]}
|